using System.Globalization;

namespace RadioTimer.Converters
{
    /// <summary>
    /// 布尔值到颜色转换器
    /// 实现IValueConverter接口，用于在XAML数据绑定中根据布尔值返回不同的颜色
    /// 常用于根据状态显示不同的颜色，例如启用/禁用状态
    /// 支持自定义真值和假值对应的颜色
    /// </summary>
    public class BoolToColorConverter : IValueConverter
    {
        /// <summary>
        /// 获取或设置布尔值为true时对应的颜色
        /// 默认为绿色，表示正常或启用状态
        /// </summary>
        public Color TrueColor { get; set; } = Colors.Green;
        
        /// <summary>
        /// 获取或设置布尔值为false时对应的颜色
        /// 默认为红色，表示异常或禁用状态
        /// </summary>
        public Color FalseColor { get; set; } = Colors.Red;

        /// <summary>
        /// 将布尔值转换为对应的颜色
        /// </summary>
        /// <param name="value">要转换的原始值，期望bool类型</param>
        /// <param name="targetType">目标类型，通常为Color类型</param>
        /// <param name="parameter">转换参数（未使用）</param>
        /// <param name="culture">区域信息（未使用）</param>
        /// <returns>返回TrueColor或FalseColor，如果转换失败则返回FalseColor</returns>
        public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
        {
            if (value is bool boolValue)
            {
                return boolValue ? TrueColor : FalseColor;
            }
            return FalseColor;
        }

        /// <summary>
        /// 反向转换方法（未实现）
        /// 该转换器不支持反向转换，因为颜色到布尔值的映射不是唯一的
        /// </summary>
        /// <param name="value">要转换的值</param>
        /// <param name="targetType">目标类型</param>
        /// <param name="parameter">转换参数</param>
        /// <param name="culture">区域信息</param>
        /// <returns>抛出NotImplementedException异常</returns>
        /// <exception cref="NotImplementedException">不支持反向转换</exception>
        public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    /// <summary>
    /// 布尔值反转转换器
    /// 实现IValueConverter接口，用于在XAML数据绑定中将布尔值反转
    /// 常用于需要反向逻辑的场景，例如禁用控件当某个条件为true时
    /// 支持双向转换，可以在true和false之间相互转换
    /// </summary>
    public class InverseBoolConverter : IValueConverter
    {
        /// <summary>
        /// 将布尔值反转
        /// 将true转换为false，将false转换为true
        /// </summary>
        /// <param name="value">要转换的原始值，期望bool类型</param>
        /// <param name="targetType">目标类型，通常为bool类型</param>
        /// <param name="parameter">转换参数（未使用）</param>
        /// <param name="culture">区域信息（未使用）</param>
        /// <returns>返回反转后的布尔值，如果转换失败则返回true</returns>
        public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
        {
            if (value is bool boolValue)
            {
                return !boolValue;
            }
            return true;
        }

        /// <summary>
        /// 反向转换布尔值（再次反转）
        /// 将已经反转的布尔值转换回原始值
        /// </summary>
        /// <param name="value">要转换的值，期望bool类型</param>
        /// <param name="targetType">目标类型，通常为bool类型</param>
        /// <param name="parameter">转换参数（未使用）</param>
        /// <param name="culture">区域信息（未使用）</param>
        /// <returns>返回反转后的布尔值，如果转换失败则返回false</returns>
        public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
        {
            if (value is bool boolValue)
            {
                return !boolValue;
            }
            return false;
        }
    }
    
    /// <summary>
    /// 布尔值到可见性转换器
    /// 实现IValueConverter接口，用于在XAML数据绑定中根据布尔值控制元素的可见性
    /// 常用于根据条件显示或隐藏UI元素
    /// 支持反向转换
    /// </summary>
    public class BoolToVisibilityConverter : IValueConverter
    {
        /// <summary>
        /// 将布尔值转换为可见性
        /// true对应Visible，false对应Collapsed
        /// </summary>
        /// <param name="value">要转换的原始值，期望bool类型</param>
        /// <param name="targetType">目标类型，通常为Visibility类型</param>
        /// <param name="parameter">转换参数（未使用）</param>
        /// <param name="culture">区域信息（未使用）</param>
        /// <returns>返回Visibility.Visible或Visibility.Collapsed</returns>
        public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
        {
            if (value is bool boolValue)
            {
                return boolValue ? Visibility.Visible : Visibility.Collapsed;
            }
            return Visibility.Collapsed;
        }

        /// <summary>
        /// 反向转换可见性到布尔值
        /// Visibility.Visible对应true，其他对应false
        /// </summary>
        /// <param name="value">要转换的值，期望Visibility类型</param>
        /// <param name="targetType">目标类型，通常为bool类型</param>
        /// <param name="parameter">转换参数（未使用）</param>
        /// <param name="culture">区域信息（未使用）</param>
        /// <returns>返回true或false</returns>
        public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
        {
            if (value is Visibility visibility)
            {
                return visibility == Visibility.Visible;
            }
            return false;
        }
    }
}